package com.java.design.pattern.decorator;

/**
 * 装饰者模式使用场景
 * <p>
 * 1、用于扩展一个类的功能或给一个类添加附加职责。
 * 2、动态的给一个对象添加功能，这些功能可以再动态的撤销。
 * 注：MyBatis中的二级缓存就是用了装饰者模式来进行动态扩展，感兴趣的可以去了解下。
 * <p>
 * 装饰者模式优点
 * <p>
 * 1、装饰者是继承的有力补充，比继承灵活，不改变原有对象的情况下动态地给一个对象 扩展功能，即插即用。
 * 2、通过使用不同装饰类以及这些装饰类的排列组合，可以实现不同效果。
 * 3、装饰者完全遵守开闭原则。
 * <p>
 * 装饰者模式缺点
 * <p>
 * 1、会出现更多的代码，更多的类，增加程序复杂性。
 * 2、动态装饰以及多层装饰时会更加复杂。
 *
 * @author xin.ding
 * @date 2020/10/29 18:16
 */
public class TestCakeDecorator {
    public static void main(String[] args) {
        Cake cake = null;
        //普通蛋糕
        cake = new BaseCake();
        System.out.println(cake.getCakeMsg() + ",价格：" + cake.getPrice());
        //加一个芒果
        cake = new CakeAddMangoDecorator(cake);
        System.out.println(cake.getCakeMsg() + ",价格：" + cake.getPrice());
        //加一个葡萄
        cake = new CakeAddGrapeDecorator(cake);
        System.out.println(cake.getCakeMsg() + ",价格：" + cake.getPrice());
        //再加一个芒果
        cake = new CakeAddMangoDecorator(cake);
        System.out.println(cake.getCakeMsg() + ",价格：" + cake.getPrice());
    }
}
